//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.json.JSONUtil;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.zzyl.common.constant.CacheConstants;
//import com.zzyl.nursing.domain.AlertData;
//import com.zzyl.nursing.domain.AlertRule;
//import com.zzyl.nursing.domain.DeviceData;
//import com.zzyl.nursing.mapper.DeviceMapper;
//import com.zzyl.nursing.service.IAlertDataService;
//import com.zzyl.system.mapper.SysUserRoleMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import javax.script.ScriptEngine;
//import java.time.LocalTime;
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.List;
//
//@Override
//public void alertFilter() {
//    // 查询所有的规则，判断是否有规则
//    long count = count(Wrappers.<AlertRule>lambdaQuery().eq(AlertRule::getStatus, 1));
//    if (count < 1) { // 没有规则
//        return; // 直接结束
//    }
//    // 从redis中获取所有设备上报的数据
//    List<Object> values = redisTemplate.boundHashOps(CacheConstants.IOT_DEVICE_LAST_DATA).values();
//    if (CollUtil.isEmpty(values)) { // redis中没有数据
//        return;
//    }
//    List<DeviceData> deviceDataList = new ArrayList<>();
//    values.forEach(value -> {
//        deviceDataList.addAll(JSONUtil.toList(value.toString(), DeviceData.class));
//    });
//    // 遍历每条设备数据，逐条处理（关键修改：在循环内调用alterFilter）
//    for (DeviceData deviceData : deviceDataList) {
//        System.out.println("-----------" + deviceData);
//        alterFilter(deviceData); // 在这里调用，每条数据单独校验规则
//    }
//}
//private void alterFilter(DeviceData deviceData) {
//    //查询报警规则,查两次
//    //1.只针对这一个设备1的status iotID    functionId
//    List<AlertRule> alertRuleList1 = list(Wrappers.<AlertRule>lambdaQuery().
//            eq(AlertRule::getStatus, 1)
//            .eq(AlertRule::getIotId, deviceData.getIotId())
//            .eq(AlertRule::getFunctionId, deviceData.getFunctionId())
//    );
//    //2.针对所有这个产品下的设备 status  -1  functionID
//    List<AlertRule> alertRuleList2 = list(Wrappers.<AlertRule>lambdaQuery().
//            eq(AlertRule::getStatus, 1)
//            .eq(AlertRule::getIotId, -1)
//            .eq(AlertRule::getFunctionId, deviceData.getFunctionId())
//    );
//    //合并两个规则列表
//    Collection<AlertRule> alertRulelist = CollUtil.addAll(alertRuleList1, alertRuleList2);
//    //判断是否有规则
//    if (CollUtil.isEmpty(alertRulelist)) {
//        return;
//    }
//    for (AlertRule alertRule : alertRulelist) {
//        //准备校验
//        deviceDataAlarmHandler(alertRule, deviceData);
//    }
//}
//@Autowired
//private ScriptEngine scriptEngine;
//
//
//private void deviceDataAlarmHandler(AlertRule alertRule, DeviceData deviceData) {
//    System.out.println("开始处理四层的校验的第一层......");
//    String period = alertRule.getAlertEffectivePeriod();
//    // 校验时间格式是否正确（避免split后数组越界）
//    if (period == null || !period.contains("~")) {
//        System.out.println("报警有效时段格式错误: " + period);
//        return;
//    }
//    LocalTime startTime = LocalTime.parse(period.split("~")[0]);
//    LocalTime endTime = LocalTime.parse(period.split("~")[1]);
//    LocalTime localTime = deviceData.getAlarmTime().toLocalTime();
//    if (localTime.isBefore(startTime) || localTime.isAfter(endTime)) {
//        return;
//    }
//    System.out.println("开始处理四层的校验的第二层......");
//
//    // 拼凑表达式  上报的数据+运算符+阈值
//    String expression = deviceData.getDataValue() + alertRule.getOperator() + alertRule.getValue();
//    // 计算表达式结果
//    boolean isReach = false;  // 上报的数据是否达到阈值
//    try {
//        // 执行脚本并转换为布尔值
//        Object result = scriptEngine.eval(expression);
//        isReach = Boolean.parseBoolean(result.toString());
//    } catch (ScriptException e) {
//        e.printStackTrace();
//        isReach = false;
//    }
//    // 缓存键定义
//    String alertCountKey = CacheConstants.ALERT_TRIGGER_COUNT_PREFIX
//            + deviceData.getIotId() + deviceData.getProductKey()
//            + alertRule.getFunctionId() + alertRule.getId();
//    String slientKey = CacheConstants.ALERT_SILENT_PREFIX
//            + deviceData.getIotId() + deviceData.getProductKey()
//            + alertRule.getFunctionId() + alertRule.getId();
//
//    if (!isReach) {
//        redisTemplate.delete(alertCountKey); // 删除报警数
//        return;  // 不需要报警
//    }
//    System.out.println("开始处理四层校验的第三层.......");
//
//    // 后续可以添加达到阈值后的处理逻辑
//    if (redisTemplate.hasKey(slientKey)) {
//        return;
//    }
//    System.out.println("开始处理四层校验的第四层.......");
//    // 第一个参数是哈希表中的字段名（比如 "count"），第二个参数是自增步长
//    Long count = redisTemplate.boundHashOps(alertCountKey).increment("count", 1);
//    if (alertRule.getDuration() > count) {
//        return;
//    }
//    //可以报警了
//    redisTemplate.delete(alertCountKey);//删除报警数
//    //添加沉默周期
//    redisTemplate.boundValueOps(slientKey).set("", alertRule.getAlertSilentPeriod(), TimeUnit.MINUTES);
//    System.out.println("检验全部通过");
//    // 插入报警数据
//    insertAlertData(alertRule, deviceData);
//}
//@Autowired
//private DeviceMapper deviceMapper;
//@Autowired
//private SysUserRoleMapper sysUserRoleMapper;
//
//
//// alert:
//// deviceMaintainerRole
//@Value("${system.alert.deviceMaintainerRole}")
//private String deviceMaintainerRole;
//
//@Value("${system.alert.managerRole}")
//private String managerRole;
//
//@Autowired
//private IAlertDataService alertDataService;
//
//private void insertAlertData(AlertRule alertRule, DeviceData deviceData) {
//    //查人
//    //locationType '位置类型 0 :随身设备 1 : 固定设备',
//    List<Long> userIds = new ArrayList<>(); // 可变集合
//    if (deviceData.getLocationType().equals(0)) {
//        //随身的
//        //根据这个设备找到护理员
//        userIds = deviceMapper.selectNursingIdsByIotIdWithElder(deviceData.getIotId());
//    } else {
//        //继续判断固定设备是在床位上还是在房间里
//        //physicallocationType '物理位置类型 0 ;楼层  1 房间 2 床位'
//        if (deviceData.getPhysicalLocationType().equals(1)) {
//            userIds = sysUserRoleMapper.selectUserIdByRoleName(deviceMaintainerRole);
//
//        } else if (deviceData.getPhysicalLocationType().equals(2)) {
//            userIds = deviceMapper.selectNursingIdsByIotIdWithBed(deviceData.getIotId());
//
//        }
//    }
//    //所有的报警数据都 要经过超级管理员
//    List<Long> adminIds = sysUserRoleMapper.selectUserIdByRoleName(managerRole);
//    //合并ids
//    Collection<Long> userIdList = CollUtil.addAll(userIds, adminIds);
//    //去重
//    userIdList = CollUtil.distinct(userIdList);
//
//    List<AlertData> alertDataList = new ArrayList<>();
//    for (Long userId : userIdList) {
//        AlertData alertData = new AlertData();
//
//        alertData.setIotId(deviceData.getIotId());
//        alertData.setDeviceName(deviceData.getDeviceName());
//        alertData.setProductKey(deviceData.getProductKey());
//        alertData.setProductName(deviceData.getProductName());
//
//        alertData.setFunctionId(deviceData.getFunctionId());
//        alertData.setAccessLocation(deviceData.getAccessLocation());
//        alertData.setLocationType(deviceData.getLocationType());
//        alertData.setPhysicalLocationType(deviceData.getPhysicalLocationType());
//        alertData.setDeviceDescription(deviceData.getDeviceDescription());
//        alertData.setDataValue(deviceData.getDataValue());
//        alertData.setAlertRuleId(alertRule.getId());
//        alertData.setAlertReason(deviceData.getFunctionId() + alertRule.getOperator() + alertRule.getValue() + alertRule.getDuration() + alertRule.getAlertSilentPeriod());
////            alertData.setProcessingResult("");
////            alertData.setProcessorId(0L);
////            alertData.setProcessorName("");
////            alertData.setProcessingTime(new Date());
//        alertData.setType(alertRule.getAlertDataType());
//        alertData.setStatus(0);
//        alertData.setUserId(userId);
//        alertDataList.add(alertData);
//    }
//    alertDataService.saveBatch(alertDataList);
//
//    // 发送websocket消息
//    websocketNotity(alertDataList.get(0), alertRule, userIds);
//}
//@Autowired
//private WebSocketServer webSocketServer;
///**
// * websocket推送消息
// *
// * @param alertData
// * @param rule
// * @param userIds
// */
//private void websocketNotity(AlertData alertData, AlertRule rule, Collection<Long> userIds) {
//    //属性拷贝
//    AlertNotifyVo alertNotifyVo = BeanUtil.toBean(alertData, AlertNotifyVo.class);
//    alertNotifyVo.setAccessLocation(alertData.getRemark());
//    alertNotifyVo.setFunctionName(rule.getFunctionName());
//    alertNotifyVo.setAlertDataType(rule.getAlertDataType());
//    alertNotifyVo.setNotifyType(1);
//    //向指定的人推送消息
//    webSocketServer.sendMessageToConsumer(alertNotifyVo, userIds);
//}
//}